package Classes;

import java.io.Serializable;
import java.util.*;

/**
 * Classe para representar um item, que tem um proprietario e um guardiao.
 * 
 * @author Andreza Raquel
 *
 */
public abstract class Item implements Serializable{

    private Usuario proprietario, guardiao;
    private Map<Usuario, Double> notas;
    private Map<Usuario, String> comentarios;
    private Disponibilidade disponibilidade;
    private String nomeItem;
    
    /**
     * Construtor da classe
     * @param proprietario 
     *      Dono do item
     */
    public Item(Usuario proprietario, String nome) {
        this.proprietario = proprietario;
        this.guardiao = proprietario;
        notas = new HashMap<>();
        comentarios = new HashMap<>();
        disponibilidade = Disponibilidade.INDISPONIVEL;
        this.nomeItem = nome;
    }  

    /**
     * Avalia um item com uma nota
     * @param usuario
     *      Usuario que esta avaliando
     * @param nota 
     *      Nota dada
     */
    public void avaliaItem(Usuario usuario, double nota) {
        notas.put(usuario, nota);
    }
    
    /**
     * @return A media aritmetica do item
     */
    public double getMedia() {
        if (notas.keySet().isEmpty())
            return 0;
        double soma = 0;
        for (Usuario u : notas.keySet()) {
            soma += notas.get(u);
        }
        return soma / notas.keySet().size();
    }
    
    /**
     * Adiciona um comentario ao item
     * @param usuario
     *      Usuario a comentar
     * @param comentario 
     *      Comentario a ser adicionado
     */
    public void adicionaComentario(Usuario usuario, String comentario) {
        comentarios.put(usuario, comentario);
    }
    
    /**
     * Define uma disponibilidade pro item
     * @param novaDisponibilidade 
     *      A nova disponibilidade do item
     */
    public void disponibilidade(Disponibilidade novaDisponibilidade){
        disponibilidade = novaDisponibilidade;
    }      

    /**
     * @return A disponibilidade atual do item
     */
    public Disponibilidade getDisponibilidade(){
        return disponibilidade;
    } 
    
     /**
     * Define um novo nome do item
     *
     * @param novoNome O novo nome do item
     */
    public void setNome(String novoNome) {
        this.nomeItem = novoNome;
    }
    
    
    /**
     * @return O nome do Item
     */
    public String getNome() {
        return nomeItem;
    }

    /**
     * @return O proprietario do item
     */
    public Usuario getProprietario() {
        return proprietario;
    }
    
    /**
     * @return O guardiao do item
     */
    public Usuario getGuardiao() {
        return guardiao;
    }

    /**
     * Define um novo guardiao pro item
     * @param novoGuardiao 
     *      O novo guardiao
     */
    public void setGuardiao(Usuario novoGuardiao) {
        guardiao = novoGuardiao;
    }

    /**
     * @return O conjunto de notas que o item ja recebeu 
     */
    public Map<Usuario, Double> getNotas() { 
        return notas;
    }
    
    /**
     * @return O conjunto de comentarios que o livro ja recebeu
     */
    public Map<Usuario, String> getComentarios() { 
        return comentarios;
    }
    
    @Override
    public String toString() {              
        return "Nome do Item: " + nomeItem + " | " + "Proprietario: " + proprietario.getPessoa().getNome() + " | Guardiao: " + guardiao.getPessoa().getNome() + " | Numero de Estrelas: " + getMedia();
    }

}